/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DTD.Validador;

import DTD.DTDTool;
import DTD.Diccionario.Diccionario;
import DTD.Diccionario.IDiccionario;
import Utilidades.StrOp;
import Utilidades.VerificadorStrings;

/**
 *
 * @author Administrador
 */
public class ValidadorSintaxisElement implements IValidadorSintaxis{

    private Diccionario diccionario;
    private ValidadorSintaxisLista validadorLista;

    public ValidadorSintaxisElement() {
        this.diccionario = new Diccionario();
        this.validadorLista = new ValidadorSintaxisLista();
    }

    public boolean validar(String aValidar) {
        boolean resultado = true;

        if (VerificadorStrings.esInicioFin(aValidar, "<!ELEMENT", ">") == false) {
            resultado = false;
        }
        else if (VerificadorStrings.estaVacia(aValidar, "<!ELEMENT", ">") == true) {
            resultado = false;
        }
        else if (VerificadorStrings.tieneMasDe(aValidar, "<>!", 1, false) == true) {
            resultado = false;
        }
        else if (validarNombre(aValidar) == false) {
            resultado = false;
        }
        else if (validarSintaxis(aValidar) == false) {
            resultado = false;
        }
        else if (validarLista(aValidar) == false) {
            resultado = false;
        }
        return resultado;
    }

    private boolean validarLista(String aValidar) {
        boolean resultado = true;

        if (VerificadorStrings.tieneMasDe(aValidar, "()", 0, false) == true) {
            String list = DTDTool.extractList(aValidar);
            if (list != null && this.validadorLista.validar(list) == false) {
                resultado = false;
            }
        }
        return resultado;
    }

    private boolean validarSintaxis(String aValidar) {
        boolean resultado = true;
        boolean tieneLista = (DTDTool.extractList(aValidar) != null);
        String aux = aValidar;
        String[] array = StrOp.separar(aux, " ", "<!ELEMENT", ">", '(', ')');

        if (diccionario.existe(array[0])) {
            resultado = false;
        }
        else if (array.length == 1) {
            resultado = false;
        }
        else if (array.length == 2 && diccionario.getTipoDiccionario(array[0]) == IDiccionario.DATA_TYPE) {
            resultado = false;
        }
        else if (array.length == 2 && diccionario.getTipoDiccionario(array[0]) == IDiccionario.ELEMENT_OPCIONAL) {
            resultado = false;
        }
        else if (array.length == 2 && diccionario.getTipoDiccionario(array[1]) != IDiccionario.ELEMENT_OPCIONAL && tieneLista == false) {
            resultado = false;
        }
        else if (array.length > 2 && tieneLista == false) {
            resultado = false;
        }
        else if (diccionario.getTipoDiccionario(array[array.length - 1]) != IDiccionario.ELEMENT_OPCIONAL && tieneLista==false) {
            resultado = false;
        }
        return resultado;
    }

    private boolean validarNombre(final String aValidar) {
        boolean resultado = true;
        String nombre = StrOp.separar(aValidar, " ", "<!ELEMENT", ">", '(', ')')[0];

        if (VerificadorStrings.tieneMasDe(nombre, "?-!/@$%&", 0, false) == true) {
            resultado = false;
        }
        if (diccionario.existe(nombre) == true) {
            resultado = false;
        }
        return resultado;
    }
}
